package com.bzkj.basicinfo.service.receive;

import com.bzkj.basicinfo.domain.receive.WmsReceiveOrderDetailEntity;
import com.bzkj.basicinfo.domain.receive.WmsReceiveOrderEntity;
import com.bzkj.common.core.domain.AjaxResult;
import com.bzkj.common.core.page.TableDataInfo;

import java.util.List;

/**
 * WMS收货管理服务接口
 *
 *@author lixinyu
 * @date 2025-10-22
 */
public interface WmsReceiveOrderService {

    /**
     * 查询收货单列表（分页）
     *
     * @param entity 收货单查询条件
     * @param pageNum 页码
     * @param pageSize 每页条数
     * @return 分页结果
     */
    TableDataInfo getReceiveOrderList(WmsReceiveOrderEntity entity, int pageNum, int pageSize);

    /**
     * 根据ID查询收货单详情（含明细）
     *
     * @param id 收货单ID
     * @return 收货单详情
     */
    AjaxResult getReceiveOrderDetail(Long id);

    /**
     * 创建收货单
     *
     * @param entity 收货单主表
     * @param detailList 收货单明细列表
     * @return 结果
     */
    AjaxResult createReceiveOrder(WmsReceiveOrderEntity entity, List<WmsReceiveOrderDetailEntity> detailList);

    /**
     * 修改收货单
     *
     * @param entity 收货单
     * @return 影响行数
     */
    int updateReceiveOrder(WmsReceiveOrderEntity entity);

    /**
     * 删除收货单
     *
     * @param id 收货单ID
     * @param operator 操作人
     * @param reason 删除原因
     * @return 结果
     */
    AjaxResult deleteReceiveOrder(Long id, String operator, String reason);

    /**
     * 提取收货单（状态：待收货 -> 收货中）
     *
     * @param id 收货单ID
     * @param operator 操作人
     * @return 影响行数
     */
    int extractReceive(Long id, String operator);

    /**
     * PDA完成收货（状态：收货中 -> 已收货）
     *
     * @param id 收货单ID
     * @param operator 操作人
     * @return 结果
     */
    AjaxResult completeReceive(Long id, String operator);

    /**
     * 签字确认（状态：已收货 -> 已完成）
     *
     * @param id 收货单ID
     * @param operator 操作人
     * @return 影响行数
     */
    int signReceive(Long id, String operator);

    /**
     * 作废收货单（状态 -> 异常）
     *
     * @param id 收货单ID
     * @param operator 操作人
     * @return 影响行数
     */
    int cancelReceive(Long id, String operator);

    /**
     * PDA收货确认
     *
     * @param detailId 收货明细ID
     * @param receivedQuantity 实际收货数量
     * @param batchCode 批次号
     * @param productDate 生产日期
     * @param expDate 有效期
     * @param operator 操作人
     * @return 结果
     */
    AjaxResult confirmReceive(Long detailId,
                             java.math.BigDecimal receivedQuantity,
                             String batchCode,
                             String productDate,
                             String expDate,
                             String operator);

    /**
     * PDA拒收操作
     *
     * @param detailId 收货明细ID
     * @param rejectQuantity 拒收数量
     * @param rejectReasonType 拒收原因类型
     * @param rejectReasonDesc 拒收原因描述
     * @param photoUrls 拍照URL
     * @param operator 操作人
     * @return 结果
     */
    AjaxResult rejectReceive(Long detailId,
                           java.math.BigDecimal rejectQuantity,
                           String rejectReasonType,
                           String rejectReasonDesc,
                           String photoUrls,
                           String operator);

    /**
     * 确认已到货（状态：未收货 -> 已到货，并创建验收任务）
     *
     * @param id 收货单ID
     * @param operator 操作人
     * @return 结果
     */
    AjaxResult confirmArrival(Long id, String operator);
}
